home *** CD-ROM | disk | FTP | other *** search
- ; ____________________________________________________________________________
- ;
- ; AMOS Complex mask calculation
- ;
- ; [Number,Colour0,Colour1]
- ; ____________________________________________________________________________
-
- OPT P+
- Include "|AMOS_Includes.s"
- ; ____________________________________________________________________________
-
-
- ; Look for the sprite bank
- ; ~~~~~~~~~~~~~~~~~~~~~~~~
- bsr Bnk_GetBobs
- beq Erreur
- ; Get the parameters back
- ; ~~~~~~~~~~~~~~~~~~~~~~~
- move.l (a3)+,d2 Colour 2
- move.l (a3)+,d1 Colour 1
- move.l (a3)+,d0 Number of the bob
- ; Parameter check
- ; ~~~~~~~~~~~~~~~
- tst.w d0
- ble Erreur
- cmp.w (a0)+,d0 > of available sprites
- bhi Erreur
- lsl.w #3,d0
- lea -8(a0,d0.w),a5 Adress of the bobs
- move.l (a5)+,d0
- beq Erreur
- move.l d0,a4 A4= SpriteBase
-
- * Built up table
- lea Table(pc),a0
- cmp.l (a0),d1
- bne.s DoTable
- cmp.l 4(a0),d2
- beq.s PaTable
- DoTable move.l d1,(a0)+
- move.l d2,(a0)+
- moveq #64-1,d0
- Table0 clr.b (a0)
- lsr.l #1,d1
- roxr.l #1,d2
- bcc.s Table1
- subq.b #1,(a0)
- Table1 addq.l #1,a0
- dbra d0,Table0
- PaTable
-
- * Calculation of mask size
- move.w (a4),d7 TX
- lsl.w #1,d7 En mots
- mulu 2(a4),d7 fois TY
-
- * Reserve memory (if needed)
- move.l (a5),d0
- beq.s Reserve
- bpl.s DejaLa
- Reserve move.l d7,d0
- addq.l #4,d0
- move.l d0,d2
- move.l $4,a6
- move.l #Chip|Public,d1 CHIP memory only
- jsr _LVOAllocMem(a6)
- move.l d0,(a5)
- beq Erreur
- move.l d0,a0
- move.l d2,(a0)+ Loke the size
- DejaLa move.l d0,a2
- addq.l #4,a2
-
- * Loop initialisation
- move.l d7,d6 D6-> Size of one memory plane
- subq.l #1,d7 D7-> Byte counter
- move.w 4(a4),d5 Number of planes
- subq.w #1,d5 D5-> Plane counter reload
- lea 10(a4),a1 A1-> Bitmap base
- ; A2-> Mask address
- lea Table+8(pc),a3 A3-> Mask table
-
- * Calculation loop
- .loop0 moveq #7,d3 D3-> Bit counter
- .loop1 moveq #0,d0 D0-> Color calculation
- moveq #0,d1 D1-> Bit position
- move.w d5,d2 D2-> Plane counter
- move.l a1,a0 A0-> Point to current byte
- .loop2 btst d3,(a0)
- beq.s .loop3
- bset d1,d0
- .loop3 add.l d6,a0 Next plane
- addq.w #1,d1
- dbra d2,.loop2
-
- bset d3,(a2)
- tst.b 0(a3,d0.w) Transparent colour?
- beq.s .loop4
- bclr d3,(a2)
- .loop4
- dbra d3,.loop1 Still one bit?
- addq.l #1,a1
- addq.l #1,a2
- dbra d7,.loop0 Still one byte?
-
- * All done, no errors
- moveq #0,d0
- rts
- * An error
- Erreur moveq #-1,d0
- rts
-
- ; Finds a bank adress
- ; ~~~~~~~~~~~~~~~~~~~
- Bnk_GetAdr
- move.l Cur_Banks(a5),a0
- move.l (a0),d1
- beq.s .Nof
- .Loop move.l d1,a1
- cmp.l 8(a1),d0
- beq.s .Fnd
- move.l (a1),d1
- bne.s .Loop
- .Nof sub.l a1,a1
- move.l a1,a0
- rts
- .Fnd move.w 8+4(a1),d0
- lea 8*3(a1),a0
- move.l a0,a1
- move.w #%00000,CCR
- rts
- ; Finds bob bank address
- ; ~~~~~~~~~~~~~~~~~~~~~~
- ; OUT BNE found A0/A1=address (D0/D1 unchanged)
- Bnk_GetBobs
- movem.l d0/d1,-(sp)
- moveq #1,d0
- bsr Bnk_GetAdr
- beq.s .Nof
- btst #Bnk_BitBob,d0
- .Nof movem.l (sp)+,d0/d1
- rts
-
- ******* Work table
- even
- Table ds.b 64+8
- even
-